﻿namespace CTP.CRM.Core.OTel.Options
{
    //
    // 摘要:
    //     OTel options
    //
    //     OTel 相关配置
    public class OTelOptions
    {
        //
        // 摘要:
        //     服务名称
        public string ServiceName { get; set; } = "OTel.Service";


        //
        // 摘要:
        //     服务版本
        public string ServiceVersion { get; set; } = "1.0.0";


        //
        // 摘要:
        //     OTel Collector Exporter Protocol
        //
        //     OTel Collector导出协议
        //
        //     Grpc
        //
        //     HttpProtobuf
        public string ExporterProtocol { get; set; } = "Grpc";


        //
        // 摘要:
        //     OTel Collector Exporter URL
        //
        //     OTel Collector导出地址
        public string ExporterUrl { get; set; }

        //
        // 摘要:
        //     OTel Collector Exporter Timeout Seconds
        //
        //     OTel Collector导出超时时间（秒）
        public int ExporterTimeoutSeconds { get; set; } = 10;


        //
        // 摘要:
        //     OTel Sampler Type
        //
        //     OTel采样类型
        //
        //     AlwaysSample
        //
        //     NeverSample
        //
        //     ProbabilitySampler
        //
        //     ParentBased
        public SamplerType SamplerType { get; set; } = SamplerType.AlwaysOn;


        //
        // 摘要:
        //     OTel Sampler Probability
        //
        //     OTel采样概率
        public double SamplerProbability { get; set; } = 0.5;


        //
        // 摘要:
        //     OTel ChildBasedSampler Type
        //
        //     OTel子采样类型
        public SamplerType ChildBasedSampler { get; set; } = SamplerType.AlwaysOn;


        //
        // 摘要:
        //     AspNetCore enabled or not
        //
        //     是否启用AspNetCore
        public bool EnableAspNetCore { get; set; } = true;


        //
        // 摘要:
        //     HttpClient enabled or not
        //
        //     是否启用HttpClient
        public bool EnableHttpClient { get; set; } = true;


        //
        // 摘要:
        //     过滤器
        //
        //     过滤器，用于过滤请求，返回true则忽略该请求
        public Func<HttpRequestMessage, bool> FilterHttpClient { get; set; }

        //
        // 摘要:
        //     GrpcClient enabled or not
        //
        //     是否启用GrpcClient
        public bool EnableGrpcClient { get; set; } = true;


        //
        // 摘要:
        //     EFCore enabled or not
        //
        //     是否启用EFCore
        public bool EnableSql { get; set; } = true;


        //
        // 摘要:
        //     Sql parameter enabled or not
        //
        //     是否启用Sql参数
        public bool EnableSqlParameters { get; set; } = false;


        //
        // 摘要:
        //     Redis enabled or not
        //
        //     是否启用Redis
        public bool EnableRedis { get; set; } = true;


        //
        // 摘要:
        //     CAP enabled or not
        //
        //     是否启用CAP
        public bool EnableCap { get; set; } = true;


        //
        // 摘要:
        //     Enable Console Exporter or not
        //
        //     是否启用Console导出器
        //
        //     默认启用, 如果配置了ExporterUrl则不启用
        public bool EnableConsoleExporter { get; set; } = true;


        //
        // 摘要:
        //     how to store arguments
        //
        //     参数存储方式
        public ArgumentsStoreType ArgumentsStoreType { get; set; } = ArgumentsStoreType.Event;


        //
        // 摘要:
        //     默认 false 表示当span/activity执行没有任何异常抛出时，使用 Status.Unset 状态， 改为true则使用 Status.Ok
        //     状态
        public bool SetOkStatusWhenSuccess { get; set; } = false;


        //
        // 摘要:
        //     span using method full name by default, change to true to using short name and
        //     save full name to tag or event(depend on CTP.OTel.Options.OTelOptions.ArgumentsStoreType)
        //
        //
        //     默认使用方法全名作为span名称，改为true则使用短名作为span名称，并将全名保存到tag或event中（取决于CTP.OTel.Options.OTelOptions.ArgumentsStoreType）
        public bool ShortName { get; set; } = false;


        //
        // 摘要:
        //     tags / events etc.. name
        //
        //     用于定义tags/events等名称
        public KeyNames KeyNames { get; set; }

        //
        // 摘要:
        //     序列化参数和返回值时使用的函数
        public Func<object, string> Serializer { get; set; }

        //
        // 摘要:
        //     是否启用静态weaving
        //
        //     默认启用，如果设置为false，则不会对静态方法进行weaving
        public bool EnableStaticWeav { get; set; } = true;

    }
}
